package 注解;
import java.io.IOException;
//Java注释用法
//
//注释元素的提供值必须是编译时常量表达式，我们不能使用null作为注释中任何类型元素的值。
//原始类型
//注释类型中的元素的数据类型可以是任何基本数据类型：byte，short，int，long，float，double，boolean和char。
//
//Version注释类型声明两个元素，major和minor，并且都是int数据类型。
//
//以下代码声明了注释类型:

//public @interface MyAnnotation {
//@interface MyAnnotation {
//  byte a();
//
//  short b();
//
//  int c();
//
//  long d();
//
//  float e();
//
//  double f();
//
//  boolean g();
//
//  char h();
//}
//@MyAnnotation(a=1, b=2,  c=3,  d=4,  e=12.34F, f=1.89, g=true, h="Y")
//我们可以使用编译时常量表达式来指定注释元素的值。
//
//以下两个版本注释实例有效：

//@Version(major=2+1, minor=(int)13.2)
//@Version(major=3, minor=13)
//String类型
//我们可以在注释类型中使用String类型的元素。
//
//以下代码定义了名为Name的注释类型。它有两个元素，first和last，它们是String类型。

//@interface Name  { 
//   String first(); 
//   String last();
//}
//
//@Name(first="Tom", last="Smith")
//class NameTest {
//    @Name(first="Jack", last="Iaan")
//    public void  aMethod()   {
//    }
//}
//在String类型的元素的值表达式中使用字符串连接运算符+是有效的。

//@Name(first="Ja" + "ck", last="Ia" + "an")
//Class类型
//以下代码显示如何使用类类型作为注释值。

//@interface MyAnnotation1 {
//  Class<? extends Throwable> willThrow() default java.lang.Throwable.class;
//}
//
//public class 注解用法 {
//  @MyAnnotation1(willThrow = IOException.class)
//  public static void testCase1() {
//    // Code goes here
//  }
//
//  @MyAnnotation1()
//  public static void testCase2() {
//  }
//}
//枚举类型
//注释可以具有枚举类型的元素。
//
//enum Level {
//  PENDING, FAILED, PASSED;
//}
//
//@interface Review {
//Level status() default Level.PENDING;
//
//  String comments() default "";
//}
//
//@Review(status = Level.PASSED)
//public class Main {
//
//}
//注释类型
//我们可以使用注释类型作为另一个注释类型的声明内的元素的类型。
//
//要为注释类型的元素提供值，请使用用于创建注释类型实例的语法。
//
//@interface Name {
//  String first();
//
//  String last();
//}
//
//@interface Version {
//  int major();
//
//  int minor() default 0; // zero as default value for minor
//}
//
//@interface Description {
//  Name name();
//
//  Version version();
//
//  String comments() default "";
//}
//
//@Description(name = @Name(first = "Tom", last = "Smith"), version = @Version(major = 1, minor = 2), comments = "Just a  test class")
//public class Main {
//
//}
//数组类型注释元素
//注释可以具有数组类型的元素。数组类型可以是以下类型之一：
//
//原始类型
//java.lang.String type
//java.lang.Class type
//枚举类型
//注释类型
//我们需要在大括号中指定数组元素的值。
//
//数组的元素由逗号分隔。
//
//@interface ItemList {
//  String[] items();
//}
//
//@ItemList(items = { "A", "B" })
//public class Main {
//   
//}
//如果数组中只有一个元素，则允许省略括号。
//
//@ToDo(items={"A"})
//@ToDo(items="A")
//传递一个空数组
//
//@ToDo(items={}) 
//速记注释语法
//假设我们有一个注释类型如下。
//
//@interface Enabled  {
//    boolean status() default true;
//}
//要使用带有默认值的Enabled注释类型注释程序元素，我们可以使用@Enabled()语法。
//
//我们不需要为status元素指定值，因为它具有默认值。
//
//我们可以进一步省略括号。
//
//@Enabled
//public class Main {
//
//}
//
//@Enabled()
//public class Main {
//
//}
//只有一个元素的注释类型具有速记语法。
//
//如果注释类型只有一个具有命名值的元素，我们可以省略name = value对中的名称。
//
//以下代码声明了公司注释类型，它只有一个名为value的元素:
//
//@interface Company  {
//    String value(); 
//}
//当使用公司注释时，我们可以省略name = value对的名称。
//
//@Company(value="Inc.")
//public class Test   {
//}
//变成
//
//@Company("Inc.")
//public class Test   {
//}
//以下代码显示了如果元素数据类型是数组，如何使用此缩写。
//
//@interface Item   {
//    String[] value();
//}
//
//@Item({"A", "B"})
//public class Test   {
//}
//如果我们在数组注释类型中只指定一个元素，我们可以进一步省略大括号。
//
//@Item("A")
//public class Test   {
//}
//如果我们在数组注释类型中只指定一个元素，我们可以进一步省略大括号。